package com.hope.hotel.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class TokenUtil {

    private final static String SECRET_KEY = "author:TD $$ Lihao"; // 建议使用环境变量或配置中心管理密钥
    private final static long EXPIRATION_TIME = 30L * 24* 3600 * 1000; // 30 day in milliseconds

    /**
     * 生成token.
     *
     * @param userId   用户ID
     * @param userRole 用户角色
     * @return 生成的token字符串
     */
    public static String generateToken(String userId, String userRole) {
        // 打印出过期时间
        return JWT.create()
                .withClaim("userId", userId)
                .withClaim("userRole", userRole)
                .withClaim("timeStamp", System.currentTimeMillis())
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY));
    }

    /**
     * 解析并验证token.
     * @param token 待验证的token字符串
     * @return 如果token有效且未过期，返回true；否则返回false
     */
    public static boolean validateToken(String token) {
        if (token == null || token.trim().isEmpty()) {
            return false; // 空token直接无效
        }
        try {
            DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
            return true;
        } catch (JWTVerificationException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 从token中解析出userId.
     * @param token 待解析的token字符串
     * @return 解析出的userId，
     */
    public static String getUserId(String token) {
        if (token == null || token.trim().isEmpty()) {
            return null;
        }
        DecodedJWT decodedJWT;
        try {
            // 只解码，不验证签名和过期时间，用于快速获取负载信息
            decodedJWT = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
        } catch (Exception e) {
            return null;
        }
        return decodedJWT.getClaim("userId").asString();
    }

    /**
     * 得到当前用户的权限
     */
    public static String getUserRole(String token) {
        if (token == null || token.trim().isEmpty()) {
            return null;
        }
        DecodedJWT decodedJWT;
        try {
            // 只解码，不验证签名和过期时间，用于快速获取负载信息
            decodedJWT = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                    .build()
                    .verify(token);
        } catch (Exception e) {
            return null;
        }
        return decodedJWT.getClaim("userRole").asString();
    }

    public static void main(String[] args) {
        String token =generateToken("1231234","user");
        System.out.println(token);
        System.out.println(JWT.require(Algorithm.HMAC256(SECRET_KEY)).build().verify(token).getClaim("timeStamp"));
        System.out.println(validateToken(token));
    }

}
